package log

import (
	"context"
	"kafka-ui/backend/common"
	"path/filepath"
	"time"

	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
)

type Logger struct {
	ctx    context.Context
	level  string // 日志级别
	log    *logrus.Logger
	writer *lumberjack.Logger // 压缩日志写入器
}

func NewLogger(dir string) *Logger {
	log := logrus.New()
	// 设置日志格式为JSON
	log.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: time.RFC3339, // 设置时间格式
	})
	log.SetLevel(logrus.InfoLevel) // 默认日志级别为Info
	logWriter := &lumberjack.Logger{
		Filename:   filepath.Join(dir, common.LogPath), // 日志文件路径
		MaxSize:    10,                                 // 每个日志文件的最大大小（MB）
		MaxBackups: 3,                                  // 保留的旧日志文件的最大数量
		MaxAge:     30,                                 // 保留日志文件的最大天数
		Compress:   true,                               // 是否压缩旧日志文件
	}

	// 设置日志输出到文件
	log.SetOutput(logWriter)
	log.Info("日志生成")
	return &Logger{
		log:    log,
		writer: logWriter,
		level:  "info", // 默认日志级别
	}
}
func (l *Logger) Start(ctx context.Context) {

}

func (l *Logger) Info(args ...interface{}) {
	l.log.Info(args...)
}
func (l *Logger) Infof(format string, args ...interface{}) {
	l.log.Infof(format, args...)
}

// Debugf 打印格式化的调试级别日志
func (l *Logger) Debugf(format string, args ...interface{}) {
	l.log.Debugf(format, args...)
}

// Warn 打印警告级别日志
func (l *Logger) Warn(args ...interface{}) {
	l.log.Warn(args...)
}

// Warnf 打印格式化的警告级别日志
func (l *Logger) Warnf(format string, args ...interface{}) {
	l.log.Warnf(format, args...)
}

// Error 打印错误级别日志
func (l *Logger) Error(args ...interface{}) {
	l.log.Error(args...)
}

// Errorf 打印格式化的错误级别日志
func (l *Logger) Errorf(format string, args ...interface{}) {
	l.log.Errorf(format, args...)
}

// Fatal 打印致命错误日志并终止程序
func (l *Logger) Fatal(args ...interface{}) {
	l.log.Fatal(args...)
}

// Fatalf 打印格式化的致命错误日志并终止程序
func (l *Logger) Fatalf(format string, args ...interface{}) {
	l.log.Fatalf(format, args...)
}

// Close 关闭日志文件，释放资源
// 在程序退出时调用此方法是最佳实践
func (l *Logger) Close() error {
	if l.writer != nil {
		return l.writer.Close()
	}
	return nil
}
